package com.loop.unclelend

import android.annotation.SuppressLint
import android.content.Context
import androidx.core.content.ContextCompat
import com.loop.network.OkHttp
import com.loop.network.cache.CacheEntity
import com.loop.network.cache.CacheMode
import com.loop.network.cookie.CookieJarImpl
import com.loop.network.cookie.store.DBCookieStore
import com.loop.network.interceptor.HttpLoggingInterceptor
import com.loop.network.model.HttpHeaders
import com.loop.unclelend.app_config.UncleConfigs
import com.loop.unclelend.base.BaseApplication
import com.loop.unclelend.utils.event.UnclePublisher
import com.loop.unclelend.utils.helper.SystemAnalysisHelper
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.MaterialHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
import java.util.logging.Level

/**
 * UncleLend
 * @Author wwdeng
 * @CreateTime: 2024/9/3 13:35
 * @Annotation：
 */
class MyApplication: BaseApplication() {

    //事件订阅
    lateinit var publisher: UnclePublisher

    companion object {
        // 全局Context
        @SuppressLint("StaticFieldLeak")
        lateinit var context: Context

        @SuppressLint("StaticFieldLeak")
        lateinit var app: MyApplication

        //static 代码段可以防止内存泄露
        init {
            //设置全局的Header构建器
            SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
                layout.setPrimaryColorsId(R.color.transparent, R.color.theme) //全局设置主题颜色
                MaterialHeader(context).setColorSchemeColors(ContextCompat.getColor(context,R.color.theme)) //.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
            }
            //设置全局的Footer构建器
            SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ -> //指定为经典Footer，默认是 BallPulseFooter
                ClassicsFooter(context).setDrawableSize(20f)
            }
        }
    }

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        context = base
        app = this
        publisher = UnclePublisher()
    }

    override fun onCreate() {
        super.onCreate()

        initLibConfigs()
    }

    fun getAppContext(): Context{
        return context
    }

    /**
     * 初始化Lib
     */
    private fun initLibConfigs(){
        initUncleHttpLib()
        //初始化 analysis
        SystemAnalysisHelper.initAnalysisLibAtAppLaunch()
    }

    private fun initUncleHttpLib(){
        OkHttp.getInstance().init(MyApplication.app)
        val builder = OkHttpClient.Builder()
        //log相关
        val loggingInterceptor = HttpLoggingInterceptor(UncleConfigs.UNCLE_APPNAME)
        loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.NONE) //log打印级别，决定了log显示的详细程度
        loggingInterceptor.setColorLevel(Level.INFO) //log颜色级别，决定了log在控制台显示的颜色
        builder.addInterceptor(loggingInterceptor) //添加OkGo默认debug日志
        //第三方的开源库，使用通知显示当前请求的log，不过在做文件下载的时候，这个库好像有问题，对文件判断不准确

        //超时时间设置，默认60秒
        builder.readTimeout(OkHttp.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS) //全局的读取超时时间
        builder.writeTimeout(OkHttp.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS) //全局的写入超时时间
        builder.connectTimeout(OkHttp.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS) //全局的连接超时时间
        //自动管理cookie（或者叫session的保持），以下几种任选其一就行
        //builder.cookieJar(new CookieJarImpl(new SPCookieStore(this)));            //使用sp保持cookie，如果cookie不过期，则一直有效
        builder.cookieJar(CookieJarImpl(DBCookieStore(context))) //使用数据库保持cookie，如果cookie不过期，则一直有效

        // 其他统一的配置
        // 详细说明看GitHub文档：https://github.com/jeasonlzy/
        OkHttp.getInstance().init(MyApplication.app) //必须调用初始化
            .setOkHttpClient(builder.build()) //建议设置OkHttpClient，不设置会使用默认的
            .setCacheMode(CacheMode.NO_CACHE) //全局统一缓存模式，默认不使用缓存，可以不传
            .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE) //全局统一缓存时间，默认永不过期，可以不传
            .setRetryCount(3) //全局统一超时重连次数，默认为三次，那么最差的情况会请求4次(一次原始请求，三次重连请求)，不需要可以设置为0

        //添加通用请求头
        val httpHeaders = HttpHeaders()
        httpHeaders.put("appid", UncleConfigs.UNCLE_APPNAME)
        httpHeaders.put("product", UncleConfigs.UNCLE_APPNAME)
        OkHttp.getInstance().addCommonHeaders(httpHeaders)
    }

    /**
     * 获取当前手机屏幕的宽
     */
    fun getPhoneWidth(): Int {
        // 手机屏幕的宽
        // 获取DisplayMetrics对象
        val displayMetrics = resources.displayMetrics
        return displayMetrics.widthPixels
    }

    /**
     * 获取当前手机屏幕的高
     */
    fun getPhoneHeight(): Int {
        // 手机屏幕的宽
        // 获取DisplayMetrics对象
        val displayMetrics = resources.displayMetrics
        return displayMetrics.heightPixels
    }

}